#!/usr/bin/env python
# -*- coding: utf-8 -*-
# version: 02/02/2012 beta 0.1
# Copyright Pedro Santos nº12065
#           Rui Pereira nº12061

import time
import sys
import random


'''
limpa o terminal/consola
'''
'''
os.system('clear')

begin_time = time.clock()
'''

def preencher_tabela():
    '''
    Cria a Tabela T com 1000 elementos variando a posição j (x)
    Cria e inicia na primeira posição (0) o valor de j
    Cria uma tabela de contagem tab_contagem com 10 elementos que são as possibilidades de digitos [0,9]
    '''
    T = [0 for x in range(0,1000)]
    j = 0
    tab_contagem = [0 for x in range(0,10)]

    '''
    ciclo while para percorrer a tabela T de indice j
    atribui um numero aleatorio entre 0..9 à variavel x
    Vai validar a quantidade de repetições de cada digito através de tab_contagem, cada um não pode exceder 100 repetições
    '''

    while j < 1000:
        x = random.randint(0,9)
        '''
        atribuição de valor aleatorio a x 0..9
        '''
        if tab_contagem[x] > 99:
                        continue 
                        '''
                        comprova na posição de 0..9 da tab_contagem se o digito em questão já atingio 100 repetições
                        '''
            
                        '''
                        Se atingiu o limite, salta do ciclo sem adicionar o valor randomizado à tabela T[]
                        '''
        tab_contagem[x] += 1 
        '''
        se não atinge a as 100 repetições, adiciona mais uma repetição na correspondente tabela de contagem
        '''
        T[j] = x 
        '''
        Adiciona o digito randomizado à correspondente posição j na tabela T[]
        '''
        j += 1 
        '''
        Avança a posição j na tabela T[]
        '''
        pass
        '''
        Retorna a Tabela T
        '''
    return T

'''
Percorre o preenchimento da Tabela para a não repetição de digitos
'''   

def contagem(T):
    tab_contagem = [0 for x in range(0,10)]
    for x in T:
        tab_contagem[x] += 1
        pass
    for x in tab_contagem:
        print x
        pass
    pass

T = preencher_tabela()   

'''
Função que troca posicao T[l] com o valor na posicao T[0]
''' 
def switchTab(l):
        aux = T[l]
        T[l] = T[0]
        T[0] = aux
        pass


p = random.randint(0,999)

#*****************************************************************
'''
Ciclo que atribui a Z1,Z2,Z3 e Z4 os valores calculados com base nos parametros existentes no enunciado
'''

def Acha_z():
    Z = [0 for x in range(0,5)]
    j=0
    while j <= 3:
        if (p<1000-j):
            l=p+j
            pass
        else:
            l=0
            pass
        print j+1
        print l
        #print T[l]
        Z[j+1]=T[l]
        #print Z[j]
        j+=1
        switchTab(l)
        pass
    return Z
                
Z=Acha_z()

#*************Código a eliminar daqui para baixo************
'''


Como p é sempre menor que mil na primeira criação então:

l=p
z1=T[l]
switchTab(l)
print "O valor de l para z1", l
if(p == 999):
        l=o
        pass   
else:
        l=p+1
        pass
z2=T[l]
switchTab(l)
print "O valor de l para z2", l
if(p < 998):
        l=p+2
        pass
else:
        l=0
        pass
z3=T[l]
switchTab(l)
print "O valor de l para z3", l
if(p < 997):
        l=p+3
        pass
else:
        l=0
        pass
z4=T[l]
switchTab(l)
print "O valor de l para z4", l
'''
#************************************************************************
'''
print "valor de T[l] depois da troca", T[l]
print "valor de T[0] depois da troca", T[0]
'''
print "valor de p", p

print "Valor de Z1", Z[1]
print "Valor de Z2", Z[2]
print "Valor de Z3", Z[3]
print "Valor de Z4", Z[4]
#**************************************************************************************************

N=Z[1]<<12|Z[2]<<8|Z[3]<<4|Z[4]
print "O nosso valor de N é:", N

p=Z[1]*100+Z[2]*10+Z[3]*1

print "O novo p para a proxima interação",p

'''
Prints de output to tamanho da tabela 1000, da tabela e das contagens a cada 100 elementos  

print len(T)
print T
contagem(T)


'''

'''
end_time = time.clock()
print "Tempo estimado de processamento por este programa foi de -> " + str(end_time-begin_time)
'''


